Este informe se enmarca en un proyecto de portafolio personal para la práctica de análisis e interpretación de datos usando RStudio. En este caso, se presenta un breve análisis exploratorio de la base de datos Gapminder, que contiene variables socio-económicas para 142 países. El ejercicio propuesto para la práctica de RStudio, consistió en solicitarle a modelos de IA (ChatGPT y Google Gemini) que me asignaran ejercicios de análisis y exploración de datos en aras de prácticar mis habilidades y proceso de aprendizaje en RStudio, es decir, sin especificar el código a ejecutar para completar las tareas propuestas. Además de esto, mediante estos mismos modelos de IA solicité retroalimentación técnica (respecto a la ejecución de las funciones y los operadores) y conceptual-interpretativa.
knitr::opts_chunk$set(echo = TRUE)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(forcats)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ lubridate 1.9.4 ✔ stringr 1.5.1
## ✔ purrr 1.0.4 ✔ tibble 3.3.0
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(knitr)
library(gganimate)
library(gifski)
library(gapminder)
data(gapminder)
gapminder%>%
head(10)
## # A tibble: 10 × 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Afghanistan Asia 1952 28.8 8425333 779.
## 2 Afghanistan Asia 1957 30.3 9240934 821.
## 3 Afghanistan Asia 1962 32.0 10267083 853.
## 4 Afghanistan Asia 1967 34.0 11537966 836.
## 5 Afghanistan Asia 1972 36.1 13079460 740.
## 6 Afghanistan Asia 1977 38.4 14880372 786.
## 7 Afghanistan Asia 1982 39.9 12881816 978.
## 8 Afghanistan Asia 1987 40.8 13867957 852.
## 9 Afghanistan Asia 1992 41.7 16317921 649.
## 10 Afghanistan Asia 1997 41.8 22227415 635.
Hay 12 observaciones por cada país de la base de datos, que corresponde a 12 años de observación.
# podríamos hacer un conteo para mirar qupé países tienen sólo una observación
gapminder%>%
group_by(country)%>%
count()
## # A tibble: 142 × 2
## # Groups: country [142]
## country n
## <fct> <int>
## 1 Afghanistan 12
## 2 Albania 12
## 3 Algeria 12
## 4 Angola 12
## 5 Argentina 12
## 6 Australia 12
## 7 Austria 12
## 8 Bahrain 12
## 9 Bangladesh 12
## 10 Belgium 12
## # ℹ 132 more rows
El modelo de IA al que asigné la revisión de este ejercicio de análisis sugiere que, para precisar más el ejercicio, la función correcta es n_distinct(). Así:
n_distinct(gapminder$country)
## [1] 142
Este resultado es evidentemente más preciso que el anterior.
gapminder%>%
group_by(continent)%>%
summarise(life_expc_mean=round(mean(lifeExp,na.rm=T),1))%>%
arrange(desc(life_expc_mean))%>%
kable(col.names = c("Continent","Life expectation (mean)"))
| Continent | Life expectation (mean) |
|---|---|
| Oceania | 74.3 |
| Europe | 71.9 |
| Americas | 64.7 |
| Asia | 60.1 |
| Africa | 48.9 |
Se puede apreciar lo que la intuición contextual, es decir, lo que suele ser ya conocido y que, por demás, está más que diagnosticado. Esto es, el reflejo de las desigualdades sociales el sistema mundial, como lo puede expresar no sólo un indicador económico como el PIB per cápita sino métricas como la duración de la vida de los seres humanos y todo aquello que esto implica existencial y socialmente. Aunque este informe no abordará factores más allá de los que acá se relacionan, esta distribuición de la media abre importantes interrogantes acerca de las implicaciones que, por ejemplo, tiene el pertenecer a países que en el pasado fueron colonias, tales como ser los que suelen tener expecativas de vida en años menores que aquellos que fueron potencias coloniales, así como la escases y los conflictos por los recursos naturales, el estrés, la alimentación deficiente, la sociabilidad violenta y las prácticas predatorias, pasando por características en los regímenes políticos y las necesidades básicas que no se satisfacen, más un largo etcétera de dimensiones y trayectorias que podrían complementar cualquier análisis que se hiciese.
gapminder%>%
filter(country=="Colombia",
year>=1952&year<=2007)%>%
group_by(year,lifeExp)%>%
ggplot(aes(x=year,
y=lifeExp))+
geom_line()+
labs(title = "Life expectation in Colombia (1952-2007)",
x="Year",
y="Life expectation")+
theme_classic()+
geom_point()+
geom_text(aes(label = round(lifeExp,1)),vjust=-1.5)
Para el caso colombiano, se aprecia una relación visual clara entre el crecimiento del PIB per cápita y el aumento en la expectativa de vida. Aunque también estos incrementos se podrian atribuir a diversos factores enraizados en la estrutura y los cambios socio-políticos, así como en el avance de la medicina y las políticas públicas, la incipiente industria que se desarrolló durante el Frente Nacional sería un factor interesante de analizar en el mejoramiento de las condiciones de vida, tanto en términos laborales como sanitarios.
gapminder2007<-gapminder%>%
filter(year==2007)
model_lifeexpc_gdppc<-lm(lifeExp~gdpPercap,data=gapminder2007)
summary(model_lifeexpc_gdppc)
##
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = gapminder2007)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22.828 -6.316 1.922 6.898 13.128
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.957e+01 1.010e+00 58.95 <2e-16 ***
## gdpPercap 6.371e-04 5.827e-05 10.93 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.899 on 140 degrees of freedom
## Multiple R-squared: 0.4606, Adjusted R-squared: 0.4567
## F-statistic: 119.5 on 1 and 140 DF, p-value: < 2.2e-16
El intercepto del modelo es de 5.957e+01, lo que representa que la expectativa de edad estimada en un país cuando el PIB per cápita es 0 o inexistente. Esto, pese a que no tiene sun sentido realista, es el punto de referencia para la operación. El coeficiente de regresión asociado al PIB per cápita es de 6.371e-04, lo cual expresa que por cada dólar adicional en el PIB per cápita, la expectativa de vida sube, en promedio, un 6.371e-04. Este resultado es estadísticamente significativo (p<0.005).
gapminder2007%>%
ggplot(aes(x=gdpPercap,
y=lifeExp))+
geom_point(alpha=.6)+
geom_smooth(method = "lm")+
theme_classic()+
labs(title = "Correlation between GDP per capita and life expectation (2007)",
x="GDP per capita",
y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'
Este gráfico, con su línea de regresión, expresa la relación positiva entre el crecimiento del PIB per cápita y la longevidad. No obstante, la distribución parece estar representando lo que la ley de rendimientos decrecientes planetea, en tanto se observa que el efecto de los incrementos en el PIB per cápita tiene un efecto más pronunciado sobre la expectativa de vida en aquellos países con crecimiento económico bajo, mientras que, a su turno, en países con economías más poderosas el efecto en la variable dependiente se hace marginal en la medida en que los incrementos económicos suben.
#### Transformación del PIB per cápita usando logaritmo natural (log(gdpPercap)) para la regresión.
model_ln<-lm(lifeExp~log(gdpPercap),data=gapminder2007)
summary(model_ln)
##
## Call:
## lm(formula = lifeExp ~ log(gdpPercap), data = gapminder2007)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25.947 -2.661 1.215 4.469 13.115
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.9496 3.8577 1.283 0.202
## log(gdpPercap) 7.2028 0.4423 16.283 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.122 on 140 degrees of freedom
## Multiple R-squared: 0.6544, Adjusted R-squared: 0.652
## F-statistic: 265.2 on 1 and 140 DF, p-value: < 2.2e-16
Ambos modelos correlacionan las mismas variables, sin embargo, como la varible del PIB posee una escala es tan grande, transformar esta mediante el función del logaritmo natural permite el entender el modelo de manera más clara, ya que esta nos arroja la expresión en términos proporcionales, lo cual reduce la escala. Así, en este modelo, el intercepto se encuentra 0.049496, lo cual sería la expectativa de vida asociada a un país cuando el PIB per cápita es 1 dólar (no 0 porque el logaritmo es indefinido y logaritmo natural de 1 es 0). Respecto al coeficiente de correlación, este expresa que en un incremento porcentual (de 1%) en el PIB per cápita tiene un efecto positivo de 0.07292 años más en la expectativa de vida de un país. Ahora, este modelo se ajusta mejor a los datos con base en el R^2, que para este es de 0.6544 y para el anterior fue de 0.4606.
gapminder2007%>%
ggplot(aes(x=log(gdpPercap),
y=lifeExp))+
geom_point(alpha=.6)+
geom_smooth(method = "lm")+
theme_classic()+
labs(title = "Correlation between GDP per capita and life expectation",
x="GDP per capita (LogNat)",
y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'
Se aprecia una relación más clara que en el gráfico de dispersión anterior, debido a que la transformación logarítmica de la variable independiente hace más lineal la relación, evidenciando que los rendimientos marginales, es decir, adicionales, de la riqueza en la expectativa de vida son decrecientes. No obstante, la tendencia general de la expectativa de vida sigue siendo creciente con el aumento del PIB per cápita.
gapminder%>%
ggplot(aes(x=gdpPercap,
y=lifeExp,
color=continent))+
geom_point(alpha=.5,size=2)+
theme_classic()+
labs(title = "Time evolution: life expectation and GDP per capita",
x="GDP per capita",
y="Life expectation",
color="Continent",
subtitle = "Year: {frame_time}")+
transition_time(year)+
ease_aes('linear')
Este pertinente notar la distancia y el rezago que África presenta durante la década de 1990. Además de esto, se evidencia que, a diferencia del resto de continentes, África no presenta un crecimiento económico visual tan acelerado, tal como puede apreciarse con Europa, América y Ásia, mas sí incrementa su expectativa de vida. Lo anterior, podría dar paso a hipótesis más precisas que tomen en cuenta nuevos y diferentes factores que no sólo se limiten al PIB per cápita sino también avances médico-tecnológicos, políticas públicas de salud, mejoras infraestructurales, acceso a mejores recursos (como la calidad del agua potable), entre otros a considerar.
Tomaremos una muestra aleatoria: un país por cada continente
# muestra aleatoria # se debe desagrupar luego sacar la muestra
gapminder%>%
distinct(continent,country)%>%
group_by(continent)%>%
slice_sample(n=1)%>%
ungroup()
## # A tibble: 5 × 2
## continent country
## <fct> <fct>
## 1 Africa Equatorial Guinea
## 2 Americas Panama
## 3 Asia Hong Kong, China
## 4 Europe Hungary
## 5 Oceania New Zealand
countries_comp<-gapminder%>%
filter(country=="Somalia"|
country=="Jamaica"|
country=="Yemen, Rep."|
country=="Montenegro"|
country=="Australia")
Para poder comparar escalas con medidas tan diferentes como lo son la expectativa de vida y el PIB per cápita, procedemos a normalizar las varibales para poder conseguir una escala común. La fórmula para normalizar es x’=(x-min(x))/(max(x) - min(x)); esto es, valor normalizado (x’) es igual (=) a el valor original (x) menos el valor mínimo de la variable (min(x)) sobre (/) el valor máximo de la variable (max(x)) menos (-) el valor mínimo de la variable (min(x)).
Así, debemos crear los valores normalizados para las variables a comparar: expectativa de vida y PIB per cápita.
# creamos las nuevas variables con los valores normalizados
countries_comp<-countries_comp%>%
mutate(norm_lifeexpc=(lifeExp-min(lifeExp))/(max(lifeExp)-min(lifeExp)),
norm_gdppc=(gdpPercap-min(gdpPercap))/(max(gdpPercap)-min(gdpPercap)))
Procedemos a pivotear los datos, lo cual consiste, esencialmente, en transformar datos de un formato a otro. De formato ancho (wide format) a formato largo (long format) y viceversa. Este proceso se realiza para poder graficar dos variables o más en un mismo eje.
norm_countries_comp<-countries_comp%>%
pivot_longer(cols = c(norm_lifeexpc,norm_gdppc),names_to = "metric",values_to = "norm_value")
norm_countries_comp%>%
ggplot(aes(x=year,
y=norm_value,
color=country,
linetype=metric))+
geom_line(linewidth=1.1)+
theme_linedraw()+
theme_linedraw()+
labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
x="Year",
y="Normalized value",
color="Country",
linetype="Metric")
Véamos ahora lo mismo pero por páneles, según la pertenencia de cada país a su respectivo continente.
norm_countries_comp%>%
ggplot(aes(x=year,
y=norm_value,
color = country,
linetype = metric))+
geom_line(size=1.2)+
theme_linedraw()+
facet_wrap(~continent)+
labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
x="Year",
y="Normalized value",
color="Country",
linetype="Metric")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
En los gráficos anteriores se revela la correlación positiva entre el PIB per cápita y la expectativa de vida: a mayor riqueza de un país, mayor es la longevidad de su población. Un punto crucial, como ya se había expuesto anteriormente, es la presencia de rendimientos decrecientes. Los primeros aumentos de riqueza en países de bajos ingresos generan mejoras sustanciales en la expectativa de vida (por ejemplo, por mejoras en salud y saneamiento). Sin embargo, a medida que los países se vuelven más ricos, cada incremento adicional en el PIB per cápita produce aumentos progresivamente menores en los años de vida. La evolución temporal de países como Australia, con ingresos altos, en comparación con Somalia, con alta dependencia y pobreza, expresa la dinámica de desigual de desarrollo en un sistema interdependiente, donde existe un estancamiento económico en la periferia del sistema global y se mantiene el crecimiento y la expansión de los miembros del eje occidental integrado.